package pre.web;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import pre.service.boardService;
import pre.vo.boardVO;
import pre.vo.pagingBoardVO;
/**
 * 게시판 메인 Controller 클래스
 * @author hyem55
 */
//객체 등록
@Controller
public class boardController {
	//의존성 주입(실습)
	@Resource(name="boardService")
	private boardService service;
	
	/*
	 * 게시판 전체 목록 조회(실습)
	 * @param : Model model, String page
	 * @return "/mainBoard"
	 * 1. 페이지객체와 게시판객체가 병합된 pagingBoardVO 객체를 변수명 list로 선언 
	 * 2. int형 변수 numPage를 1로 초기화하여 선언
	 * 3. 파라미터로 넘겨 받은 현재 페이지 값이 null이 아닐 경우 
	 * 4. 파라미터로 넘겨 받은 현재 페이지 값이 null일 경우 numPage의 값을 1로 정의
	 * 5. boardService의 게시판 전체 목록을 조회하는 메소드(selectBoardListByPage(int형)) 사용하여 list 값을 정의
	 * 6. jsp파일(뷰)에 list 값을 전달할 수 있도록 model에 값을 담는다. 
	 * 7. jsp파일(뷰)에 page 값을 전달할 수 있도록 model에 값을 담는다. 
	 * 8. 메인 게시판화면(mainBoard.jsp)을 호출한다.
	 */
	@RequestMapping("/mainBoard.do")
	public String boardList(Model model, @RequestParam(value="page", required=false)String page){
		pagingBoardVO list = null;//1.
		int numPage = 1;//2.
		try{
			if(page!=null){
				numPage = Integer.parseInt(page);//3.
			}else {
				numPage = 1;//4.
			}
			list = service.selectBoardListByPage(numPage);//5.
			model.addAttribute("list",list);//6.
			model.addAttribute("page",page);//7.
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("message","리스트 뷰 과정에서 오류가 발생");
		}
		return "/mainBoard";//8.
	}
	
	/*
	 * 게시판 글쓰기 > 글쓰기 화면 호출
	 * @return "/writeBoard"
	 */
	@RequestMapping("/writeBoard.do")
	public String boardWrite(){
		return "/writeBoard";
	}
	/*
	 * 게시판 글쓰기 > 글쓰기 등록(저장)
	 * @param : 게시판객체(boardVO board), View에 전달할 객체들을 담고 있는 객체(Model model)
	 * @return "forward:/mainBoard.do"
	 * 1. 게시판 객체(어노테이션 선언), View에 전달할 객체들을 담고 있는 객체를 파라미터 요소로 정의한다.
	 * 2. boardService의 게시판 글쓰기 등록을 위한 메소드(insertBoard(boardVO형))를 선언하여 sql문을 실행  
	 * 3. forward형식을 이용하여 특정화면(mainBoard.jsp)로 이동하기 위해 컨트롤러의 메소드를 바로 호출
	 */
	@RequestMapping("/saveBoard.do")
	public String saveWriteBoard(@ModelAttribute boardVO board, Model model){//1.
		try{
			service.insertBoard(board);//2.
			//model.addAttribute("board",board);//필요없는 부분
			model.addAttribute("message", "작성한 게시물이 등록되었습니다^^");
		}catch(NullPointerException e){
			model.addAttribute("message","작성한 게시물이 오류로 인해 등록되지 않았습니다.ㅠㅠ");
			return "/writeBoard";
		}
		return "forward:/mainBoard.do";//3.
	}
	
	/*
	 * 게시판 글 삭제
	 * @param : String boardNum, Model model
	 * @return "redirect:/mainBoard.do"
	 * 1. 삭제하고자 하는 게시판 번호(@RequestParam사용), View에 전달할 객체들을 담고 있는 객체를 파라미터로 선언
	 * 2. boardService의 게시판 삭제 메소드(deleteBoardByNum(int형))를 선언하여 sql문 실행
	 * 3. 삭제 로직 완료 후 redirect형식을 이용하여 특정화면(mainBoard.jsp)로 이동하기 위해 컨트롤러의 메소드를 바로 호출
	 */
	@RequestMapping("/deleteBoard.do")
	public String deleteBoard(@RequestParam(value="boardNum", required=false) String boardNum, Model model){//1.
		try{
			service.deleteBoardByNum(Integer.parseInt(boardNum));//2.
			model.addAttribute("message","삭제가 정상적으로 완료되었습니다.^^");
		}catch(Exception e){
			model.addAttribute("message","게시물 삭제 중 오류가 발생되었습니다.ㅠㅠ");
			return "redirect:/mainBoard.do";
		}
		return "redirect:/mainBoard.do";//3.
	}
	/*
	 * 게시판 글 검색
	 * @param : String searchType, String page, String searchText, Model model
	 * @return "/mainBoard" 
	 * 1. 검색타입, 현재 페이지, 검색어, View에 전달할 객체들을 담고있는 객체를 파라미터로 선언(@RequestParam을 사용)
	 * 2. 페이징처리된 게시판 목록을 담을 객체를 변수명 list로 선언하고 null로 초기화
	 * 3. 현재 조회할 페이지 값을 담을 int현 변수 numPage를 선언하고 초기값을 1로 정의;
	 * 4. 검색타입의 값이 regName과 동일할 경우 list 변수에 boardService의 글 검색(검색조건:글쓴이) 메소드(searchBoardListByRegName)로 부터 받은 리턴값을 저장한다.
	 * 5. jsp파일(뷰)에 list 값을 전달할 수 있도록 model에 값을 담는다. 
	 * 6. jsp파일(뷰)에 page 값을 전달할 수 있도록 model에 값을 담는다. 
	 * 7. 검색된 게시판 목록의 갯수가 0일 경우
	 * 8. jsp파일(뷰)에 message 값을 전달할 수 있도록 model에 값을 담는다. 
	 * 9. 메인 게시판화면(mainBoard.jsp)을 호출한다.
	 */
	@RequestMapping("/searchBoard.do")
	public String searchBoard(@RequestParam("searchType") String searchType, @RequestParam(value="page", required=false)String page, @RequestParam(value="searchText", required=false) String searchText, Model model){//1.
		pagingBoardVO list = null;//2.
		int numPage = 1;//3.
		try{
			if(searchType.equals("regName")){
				list = service.searchBoardListByRegName(numPage, searchText);//4.
			}else{
				model.addAttribute("message","검색 중 오류 발생");
				return "forward:/error.do";
			}
			model.addAttribute("list",list);//5.
			model.addAttribute("page", numPage);//6.
			
			if(list.getBoardList().size() == 0){//7.
				model.addAttribute("message","검색 결과가 없습니다.");
			}else{
				model.addAttribute("message",list.getBoardList().size( ) + "개의 글이 검색되었습니다.");//8.
			}
		}catch(Exception e){
			model.addAttribute("message",e.getMessage() + "검색 중 오류 발생");
			return "forward:/error.do";

		}
		return "/mainBoard";//9.

	}
}
